/*******************************************************************************
 * Copyright (c) 2010 liw.
 * All rights reserved. 
 * 
 * This file is part of VanBus.
 * 
 *     VanBus is free software: you can redistribute it and/or modify
 *     it under the terms of the GNU General Public License as published by
 *     the Free Software Foundation, either version 3 of the License, or
 *     (at your option) any later version.
 * 
 *     VanBus is distributed in the hope that it will be useful,
 *     but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
 * 
 *     You should have received a copy of the GNU General Public License
 *     along with VanBus.  If not, see <http://www.gnu.org/licenses/>.
 * Contributors:
 *     liw - initial API and implementation
 ******************************************************************************/
package org.niclab.vanbus.query;

import java.util.ArrayList;

import org.niclab.vanbus.query.command.CommandChain;
import org.niclab.vanbus.query.command.ICommand;
import org.niclab.vanbus.query.command.ICommandChain;
import org.niclab.vanbus.query.handler.IQueryHandler;
import org.niclab.vanbus.query.handler.IQueryHandlerChain;

import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;

public class AsyncQueryTask extends AsyncTask<IQueryHandler,Object,Void>{

	
	private static final String LOG_TAG="AsyncQueryTask";
	private CommandChain preCmdChain;
	private CommandChain postCmdChain;
	private CommandChain progressCmdChain;
	

	public AsyncQueryTask(){
		super();
		preCmdChain= new CommandChain();
		postCmdChain = new CommandChain();
		progressCmdChain = new CommandChain();
	}
	
	public void addAsyncPreCommand(ICommand cmd){
		this.preCmdChain.addCommand(cmd);
	}
	
	public void addAsyncPostCommand(ICommand cmd){
		this.postCmdChain.addCommand(cmd);
		
	}
	
	public void addAsyncProgressCommand(ICommand cmd){
		this.progressCmdChain.addCommand(cmd);
	}
	

	private void executePreCommand(){
		preCmdChain.execute(null);
	
		
	} 
	
	private void executePostCommand(Void result){
		postCmdChain.execute(result);
		
	}
	
	private void executeProgressCommand(Object progress){
		progressCmdChain.execute(progress);

		
	}
	
	@Override
	protected void onPreExecute(){
		super.onPreExecute();
	
		executePreCommand();
		
	}

	
	@Override
	protected void onPostExecute(Void result){
		super.onPostExecute(result);
		executePostCommand(result);
		//handle result & update UI
		
	}
	
	@Override
	//@Return void no return value
	//results will be stored in the query object
	// the problem is that this AsyncTask probably will have more than one queryHandler,
	// so to return just single result doesn't really make sense.
	protected Void doInBackground(IQueryHandler...params) {
	
		IQueryHandler queryHandler = params[0];
		queryHandler.query();
		return null;
	}
	
	public void postProgress(Object...values){
		this.publishProgress(values);
	}


	@Override
	public void onProgressUpdate(Object...values){
		
		executeProgressCommand(values[0]);
		
	}


}

	
